#include <sys/types.h>          
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>       
#define Server_port 8888

//socket
//connect
//send/recv
int main(int argc, char **argv)
{
    int client;
    int iRet;
    struct sockaddr_in tserver_addr;
    unsigned char sendbuf[1000];
    int sendlen;

    if(argc != 2)
    {
        printf("Usage:\n");
        printf("<server_ip>%s\n", argv[0]);
        return -1;
    }

    client = socket(AF_INET, SOCK_STREAM,0);//AF_INET表示ipv4，SOCK_STREAM表示启动tcp连接

    tserver_addr.sin_family = AF_INET;//ipv4
    //tserver_addr.sin_addr.s_addr = INADDR_ANY;//本机的所有ip
    tserver_addr.sin_port = htons(Server_port);//需要监听的端口host to nets转换成网络信号
    if(0 == inet_aton(argv[1],&tserver_addr.sin_addr))//把ip地址字符串转换为网络地址储存到结构体中，与inet_ntoa使用相反
    {
        printf("invalid server ip\n");
        return -1;
    }
    memset(tserver_addr.sin_zero, 0, 8);//作用是将某一块内存中的内容全部设置为指定的值，把tserver_addr.sin_zero的8位置0

    iRet = connect(client, (struct sockaddr *)&tserver_addr, sizeof(struct sockaddr));//建立连接，获取tserver_addr中的地址信息
    if(-1 == iRet)
    {
        printf("connect error\n");//connect返回值为-1时，建立连接失败
        return -1;
    }

    while(1)
    {
        if(fgets(sendbuf,999,stdin))//stdin通过输入流获取数据，传递到sendbuf中
        {
           sendlen = send(client, sendbuf,strlen(sendbuf),0);//发送sendbuf中的数据到服务器中
           if(sendlen <= 0)
           {//若数据的长度小于等于0，关闭client程序
            close(client);
            return -1;
           }
        }
    }

    return 0;
}